/*
 * @Author: hruomei
 * @Title: 消息推送文件
 * @Description: 为了统一管理消息推送逻辑,便于扩展,消息推送相关请求逻辑等写在这里
 * @CreateTime: 2019/10/01
 * @LastUpDateTime: 2020/01/20
 * @Version: V1.03
*/

import {
    THIS as _this
} from './api.js'
import {
    getMessageById,
	getMessageCount
} from '@/commons/framework/service.js'

function handleMessageReceive(msg) {
	try {
		let payload = JSON.parse(msg.payload.replace(/'/g, '"'));

		if (_this.$api.isIOS()) {
			
			//【APP离线】收到消息，但没有提醒（发生在一次收到多个离线消息时，只有一个有提醒，但其他的没有提醒）  
			//【APP在线】收到消息，不会触发系统消息,需要创建本地消息，但不能重复创建。必须加msg.type验证去除死循环                
			if (msg.aps === null && msg.type === "receive") {
				
				// 创建本地消息,发送的本地消息也会被receive方法接收到，但没有type属性，且aps是null  
				plus.push.createMessage(payload.content, payload.payload, {
					title: payload.title
				});
			}
		}

		// 如果是Android，当APP在线时，收到透传消息不会进入系统消息，需要发送本地提醒
		if (_this.$api.isAndroid()) {
			plus.push.createMessage(payload.content, msg.payload, {
				title: payload.title
			});
		}
	} catch (e) {
		console.error('handleMessageReceive():::', e);
		_this.$api.showModalWithCloseButton('数据解析异常,请联系管理员');
	}

}

// 处理消息推送点击事件
function handleMessageClick(msg) {
	try {
		getUnReadMessageNum(null, null, true);
		
		if (_this.$api.isIOS()) { //如果是IOS
			let payload,
				badgeOptions = plus.runtime.BadgeOptions;

			if (msg.type === "click") { // APP离线点击包含click属性，这时payload是JSON对象 
				payload = msg.payload;
			} else { // APP在线，收到消息不会包含type属性,这时的payload是JSON字符串，需要转为JSON对象  
				payload = JSON.parse(msg.payload);
			}

			if (payload !== null || payload !== undefined) {
				getMessageInfo(payload);
			}
		}

		// 如果是Android，收到playload均是是JSON字符串，需要转为JSON对象  
		if (_this.$api.isAndroid()) {
			if (msg.payload !== null || msg.payload !== undefined) {
				getMessageInfo(msg.payload);
			}
		}
	} catch (e) {
		console.error('handleMessageClick():::', e);
		_this.$api.showModalWithCloseButton('数据解析异常,请联系管理员');
	}
}

// 根据推送消息id获取消息
function getMessageInfo(id, callback) {
	try {
		// 如果APP已经启动完成，那么分发的事件可以直接监听到，页面也能够正常跳转;否则存入缓存等待APP准备就绪后重新获取并处理
		if (getApp().globalData.isAppReady && getApp().globalData.isIndexReady) { 
			uni.removeStorage({
			    key: 'FRAMEWORK_UNIPUSH_ID'
			});
			
			getMessageById({
				id,
				un: _this.$api.getUserInfo().ly_loginname
			}).then(result => {
				if (callback && _this.$api.isFunction(callback)) {
					callback()
				}
				
				handleMessage(result.data.rows[0]);
			}).catch(e => {
				_this.$api.errorHandleFn(e);
			});
		} else {
			uni.setStorageSync('FRAMEWORK_UNIPUSH_ID', id);
		}
	} catch(e) {
		console.error('getMessageInfo():::', e);
	}
}

// 解析消息,并处理
function handleMessage(msg) {
	try {
		let payload = JSON.parse(decodeURIComponent(msg.payload).replace(/'/g, '"').replace(/\\"/g, '"'));
		
		// payload.type 0:移动中台处理，直接跳转链接, 1:工作流待办, 2:需要分发给应用自行处理
		switch (parseInt(payload.type)){
			case 0:
				plusNavigateFn(payload.url, payload.params);
				break;
				
			case 1:
				_this.$workflow.handleWf(JSON.parse(decodeURIComponent(decodeURIComponent(payload.params))));
				break;
				
			case 2:
				uni.$emit('onUniPushClick', payload);
				break;
				
			default:
				plusNavigateFn(payload.url, payload.params);
				break;
		}
	} catch(e) {
		console.error(e);
		_this.$api.showModalWithCloseButton('数据解析异常,请联系管理员');
	}
}

// 应用启动完成后如果检测到有消息缓存,则重新处理消息
function reHandleMessage() {
	const lastUser = uni.getStorageSync('FRAMEWORK_FORCE_LOGOUT_USER');
	
	// 与上次被踢出的用户相同则重新处理消息，否则清除消息
	if (!lastUser || lastUser === _this.$api.getUserInfo().ly_id) {
		uni.getStorage({
			key: 'FRAMEWORK_UNIPUSH_ID',
			success: (res) => {
				getMessageInfo(res.data);
			}
		});
	} else {
		uni.removeStorage({
		    key: 'FRAMEWORK_UNIPUSH_ID'
		});
	}
}

// 点击消息跳转页面,如果是tabbar页面,需要使用switchTab进行跳转
function plusNavigateFn(hrefUrl, params) {
	const tabBarPage = [
		'pages/framework/index/index',
		'pages/framework/workflow/workflow',
		'pages/framework/my/my'
	];

	const isTabbarPage = tabBarPage.some(route => hrefUrl.indexOf(route) !== -1);

	if (isTabbarPage) {
		_this.$api.switchTab(hrefUrl);
	} else {
		_this.$api.navigateTo(hrefUrl, {
			message: params
		});
	}
}

// 获取未读消息数量,这里获取到的数量不包含群推消息数量
function getUnReadMessageNum(successFn, failFn, isBadge) {
	const userInfo = _this.$api.getUserInfo();
	
	if (userInfo && userInfo.ly_loginname) {
		getMessageCount({
			un: userInfo.ly_loginname,
			loading: false
		}).then(result => {
			const count = result.data.rows.count;
			
			if (isBadge) {
				count = count - 1;
			}
			
			// #ifdef APP-PLUS
			plus.runtime.setBadgeNumber(count >= 0 ? count : 0);
			// #endif
			
			successFn && _this.$api.isFunction(successFn) && successFn(count);
		}).catch(e => {
			failFn && _this.$api.isFunction(failFn) && failFn(e);
		});
	}
}

// 移除通知栏的消息,IOS不支持单条移除,只能用clear
function removeMessage(id) {
	if (!_this.$api.isAndroid()) return;
	
	const messageList = plus.push.getAllMessage();
	
	if (messageList && messageList.length) {
		messageList.forEach(message => {
			if (message.payload === id) {
				plus.push.remove(message);
				return;
			}
		});
	}
}

export default {
	handleMessageReceive,
	handleMessageClick,
	getMessageInfo,
	handleMessage,
	reHandleMessage,
	plusNavigateFn,
	getUnReadMessageNum,
	removeMessage
}